﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TorneoLoL
{
    class Fecha
    {
        private int Dia;
        private int Mes;
        private int Anio;

        public Fecha()
        {
            Dia = DateTime.Now.Day;
            Mes = DateTime.Now.Month;
            Anio = DateTime.Now.Year;
        }
        public Fecha(int Dia, int Mes, int Anio)
        {
            this.Dia = Dia;
            this.Mes = Mes;
            this.Anio = Anio;
        }
        public Fecha(string cadena)
        {
            if (!this.ConvertirstringFecha(cadena))
            {   // Si en el constructor se paso una fecha equivocada tomara la actual para evitar tener basura
                Dia = DateTime.Now.Day;
                Mes = DateTime.Now.Month;
                Anio = DateTime.Now.Year;
            }
        }
        public int DiaGyS
        {
            get
            {
                return Dia;
            }
            set
            {
                Dia = value;
            }
        }


        public int MesGyS
        {

            get
            {
                return Mes;
            }
            set
            {
                Mes = value;
            }
        }



        public int AnioGyS
        {

            get
            {
                return Anio;
            }
            set
            {
                Anio = value;
            }
        }


        public bool CalcularBis(int anio)
        {
            bool bis = false;
            if ((anio % 4 == 0 && anio % 100 != 0) || anio % 400 == 0) bis = true;

            return bis;
        }
        public bool VerificarFecha(int dia, int mes, int anio)
        {
            if (anio < 0 || anio < (DateTime.Now.Year - 100) || anio > (DateTime.Now.Year + 3))
                return false;

            int feb = 28;
            switch (mes)
            {
                case 1:case 3:case 5:case 7:case 8:case 10: case 12:
                    if (dia < 1 || dia > 31)
                        return false;
                    break;
                case 2:
                    if (CalcularBis(anio))
                        feb++;
                    if (dia < 1 || dia > feb)
                        return false;
                    break;
                case 4:case 6:case 9:case 11:
                    if (dia < 1 || dia > 30)
                        return false;
                    break;
                default:
                    return false;
            }
            
           
                return true;
        }
        public bool VerificarFecha()
        {

            bool resultado = VerificarFecha(Dia, Mes, Anio);
            return resultado;

        }
        public bool ConvertirstringFecha(string cadena)
        {
            int pos1 = cadena.IndexOf("/");
            if (pos1 < 0) return false;
            //int pos1 = cadena.IndexOf("/", 0); int pos2 = cadena.IndexOf("/", pos1);
            int pos2 = cadena.LastIndexOf("/");
            if(pos2 < 0 || pos2 == pos1) return false;

            string sDia = new string(cadena.ToArray(), 0, pos1);
            string sMes = new string(cadena.ToArray(), pos1 + 1, pos2 - pos1 - 1);
            string sAnio = new string(cadena.ToArray(), pos2 + 1, cadena.Length - pos2 - 1);

            //FormatException 
            try
            {
                Dia = int.Parse(sDia);
            }
            catch (SystemException)
            {
                return false;
            }

            try
            {
                Mes = int.Parse(sMes);
            }
            catch (SystemException)
            {
                return false;
            }

            try
            {
                Anio = int.Parse(sAnio);
            }
            catch (SystemException)
            {
                return false;
            }


            return true;
        }

        public int compararFecha(int dia, int mes, int anio)
        {   // Retorna 1 si la que recibe es en el futuro , Sino retorna -1 y 0 si las fechas coinciden
            if (Dia == dia && Mes == mes && Anio == anio) return 0;
            if (anio < Anio) return -1;
            if (anio > Anio) return 1;
            if (mes < Mes) return -1;
            if (mes > Mes) return 1;
            if (dia <= Dia) return -1;

            return +1;
        }

        public int compararFecha(Fecha ingresada)
        {

            return compararFecha(ingresada.Dia, ingresada.Mes, ingresada.Anio);
        }
        public int compararFecha(string cadena)
        {
            Fecha Ingresada = new Fecha(cadena);
            return compararFecha(Ingresada);
        }
        public int compararFecha()
        {
            return compararFecha(DateTime.Now.Day, DateTime.Now.Month, DateTime.Now.Year);
        }
        public int cantAniosHasta(Fecha aux)
        {
            int cant = aux.Anio - Anio;
            if (Mes > aux.Mes) return cant - 1;
            if (Mes == aux.Mes && Dia > aux.Dia) return cant - 1;
            return cant;
        }
        public int cantAniosHasta()
        {
            Fecha Hoy = new Fecha();

            return cantAniosHasta(Hoy);
        }
        public int cantAniosHasta(string cadena)
        {
            Fecha Ingresada = new Fecha(cadena);
            return cantAniosHasta(Ingresada);
        }
        public int cantAniosHasta(int dia, int mes, int anio)
        {
            Fecha Hoy = new Fecha(dia, mes, anio);

            return cantAniosHasta(Hoy);
        }

        public string toCadena()
        {
            string aux = Dia + "/" + Mes + "/" + Anio;
            return aux;
        }
    }
    
        
}
